﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Microsoft.Data.Odbc;


namespace ConsoleApplication1
{
    class Connexion
    {
        private const string DATABASENAME = "bdd_mediatheque";
        private OdbcConnection m_conn;

        public Connexion() { }
    
        public void Start()
        {

            string MyConstring = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost; PORT=3306;DATABASE="+ DATABASENAME +"; USER=root; PASSWORD=; OPTION=0;";
            m_conn = new OdbcConnection(MyConstring);
            m_conn.ConnectionTimeout = 1;
            try
            {
                m_conn.Open();
                System.Console.WriteLine("connected");
            }
            catch (Exception ex)
            {
                System.Console.WriteLine("Erreur de connexion à la base " + DATABASENAME + " : " + ex.Message);
                
            } 

        }

        public void Update(string table, string champ, string value, string contrainte)
        {
            string strRequete = "UPDATE "+table+" SET "+champ+"="+value+" WHERE "+contrainte+"";
                
            OdbcCommand commande = new OdbcCommand(strRequete, m_conn);
            commande.ExecuteNonQuery();
        }

        public void DeleteByID(string table, string id, string value)
        {
            string strRequete = "DELETE FROM " + table + " WHERE " + id + "=" + value +"";

            OdbcCommand commande = new OdbcCommand(strRequete, m_conn);
            commande.ExecuteNonQuery();
        }

        public void Insert(string table, List<String> champs, List<String> values, bool iscontenu)
        {
            // si on ajoute un contenu spécifique, comme un livre ou une carte, on insére la référence du dernier contenu enregistré.

            if (iscontenu && values.Count > 0)
                values[0] = rechercheDerniereReference("reference", "contenu");

           
           // System.Console.WriteLine(champs.Count + " " +  values.Count);
           // on vérifit d'abord la taille des listes
            if (champs.Count == values.Count)
            {
                // on transforme les listes en chaine de caractère, chaque item de la liste représente un champ 
                string str_champ = "";
                for (int i = 0; i < champs.Count; ++i)
                {
                    if (i < (champs.Count - 1))
                        str_champ += champs[i] + ",";
                    else
                        str_champ += champs[i];
                }

                string str_value = "";
                for (int i = 0; i < values.Count; ++i)
                {
                    if (i < (values.Count - 1))
                        str_value += values[i] + ",";
                    else
                        str_value += values[i];
                }

                string strRequete = "INSERT INTO " + table + " (" + str_champ + ")" + " VALUE (" + str_value + ")";

                OdbcCommand commande = new OdbcCommand(strRequete, m_conn);
             //   System.Console.WriteLine(strRequete);
                commande.ExecuteNonQuery();
            }
            
        }

        public List<String> rechercheGlobale(string table, string champ, string value)
        {
            List<string> tmp = new List<string>();

            string strRequete = "SELECT * FROM " + table + " WHERE " + champ + " LIKE '%" + value + "%'";

            OdbcCommand commande = new OdbcCommand(strRequete, m_conn);

            OdbcDataReader resultat = commande.ExecuteReader();
            // On teste s'il existe un résultat
            if (resultat.Read())
            {
                // Nombre de colonnes
                int nbColonnes = resultat.FieldCount;
                do
                {
                    // Parcours des différentes colonnes
                    for (int i = 0; i < nbColonnes; i++)
                    {
                  
                        if(i == nbColonnes - 1)
                            tmp.Add("[" + resultat.GetName(i) + "] : " + FormatField(resultat, i) + "\n");
                        else
                            tmp.Add("[" + resultat.GetName(i) + "] : " + FormatField(resultat, i) + " | ");
                    }
                } while (resultat.Read());
            }
           
            resultat.Close(); 

            return tmp;
        }

        public string rechercheDerniereReference(string id, string table)
        {
            string strRequete = "SELECT " + id + " FROM " + table + " ORDER BY " + id + " DESC";
            string tmp = "";

            OdbcCommand commande = new OdbcCommand(strRequete, m_conn);

            OdbcDataReader resultat = commande.ExecuteReader();
        
            if (resultat.Read())
               tmp = FormatField(resultat, 0);

            resultat.Close();

            return tmp;
        }

       

        // Retourne une chaine de caractère représantant la colonne <i> de <resultat> //
        protected string FormatField(OdbcDataReader resultat, int i)
        {
            // Champs null
            if (resultat.IsDBNull(i))
                return "[NULL]";

            // Le type du champs
            Type tField = resultat.GetFieldType(i);

            // String
            if (tField == Type.GetType("System.String"))
                return resultat.GetString(i);

            // Entier 32 bits
            if (tField == Type.GetType("System.Int32"))
                return resultat.GetInt32(i).ToString();

            // Entier 64 bits
            if (tField == Type.GetType("System.Int64"))
                return resultat.GetInt64(i).ToString("00000000");

            // Inconnu
            return "[Type: " + resultat.GetFieldType(i) + "]";
        }

       
    }
}
